천안 지역의 오늘 시간대별 기온을 기상청 API를 통해 수집하고, 이를 시각화하여 HTML 레포트로 구성하시오.
▪ [LINK] 기상청 데이터 API, 일반 인증키(DeCoding) 다운로딩
다음은 파이썬을 사용하여 기상청 API로부터 데이터를 수집하고, matplotlib를 이용하여 시간대별 기온 그래프를 생성하는 코드이다.
import requests
import json
from datetime import datetime, timedelta
import matplotlib.pyplot as plt
# 1. 기상청 격자 좌표 및 사용자 설정
service_key = 'LYSVNDnABGDZt2945mz2PugF7jTBjzTmpAkxucNUkQy+x/USojRFJm2zo4NEVklq3CSNBDPy/ydnFIQBZz9EnA=='
nx, ny = 66, 106 # 천안의 격자 좌표
# 2. 날짜 및 시간 설정 (가용성을 위해 한 시간 이전의 시간 사용)
now = datetime.now()
base_date = now.strftime('%Y%m%d')
base_hour = (now - timedelta(hours=1)).strftime('%H') + "30"
# 3. 요청 URL 및 파라미터 설정
url = 'http://apis.data.go.kr/1360000/VilageFcstInfoService_2.0/getUltraSrtFcst'
params = {
'serviceKey': service_key, # 서비스 키
'numOfRows': '1000', # 최대 데이터 수
'pageNo': '1', # 페이지 번호
'dataType': 'JSON', # 데이터 형식
'base_date': base_date, # 기준 날짜
'base_time': base_hour, # 기준 시간
'nx': nx, # X 좌표
'ny': ny # Y 좌표
}
# 4. API 요청 및 응답 상태 확인
response = requests.get(url, params=params)
print("응답 상태 코드:", response.status_code)
# 5. JSON 응답 디코딩
try:
data = response.json()
except json.JSONDecodeError:
print("⚠️ JSON 디코딩 실패")
print("응답 내용:", response.text)
exit()
# 6. 데이터 구조 접근
try:
items = data['response']['body']['items']['item']
except KeyError:
print("⚠️ 예보 데이터 접근 실패")
print("받은 JSON:", json.dumps(data, indent=2, ensure_ascii=False))
exit()
# 7. 기온(T1H) 데이터만 추출
times = []
temps = []
for item in items:
if item['category'] == 'T1H':
times.append(item['fcstTime']) # 예보 시간
temps.append(float(item['fcstValue'])) # 기온 값
# 8. 기온 데이터 유무 확인
if not temps:
print("⚠️ 기온 데이터가 존재하지 않음")
exit()
# 9. 그래프 시각화 (영문 레이블 사용)
plt.figure(figsize=(10, 5))
plt.plot(times, temps, marker='o')
plt.title('Hourly Temperature in Cheonan')
plt.xlabel('Time (HHMM)')
plt.ylabel('Temperature (°C)')
plt.grid(True)
plt.savefig('cheonan_temperature.png') # 그래프 이미지로 저장
plt.show() # 화면에 그래프 표시
plt.close()
print("✅ 그래프 저장 완료: cheonan_temperature.png")
위 코드를 실행하면 다음과 같은 시간대별 기온 그래프가 생성된다.